package com.yinshu.teleshield.tkbase.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yinshu.teleshield.tkbase.base.PageResult;
import com.yinshu.teleshield.tkbase.base.R;
import com.yinshu.teleshield.tkbase.base.entity.TKSuperEntity;
import com.yinshu.teleshield.tkbase.request.PageParams;
import com.yinshu.teleshield.utils.CommonBeanUtils;
import com.yinshu.teleshield.utils.PageResultUtils;
import io.swagger.v3.oas.annotations.Operation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

import java.io.Serializable;

/**
 * 分页控制器
 *
 * @param <Entity>    实体
 * @param <PageQuery> 分页参数
 * @author yangjunxiong
 */
public interface PageController<Id extends Serializable, Entity extends TKSuperEntity<Id>, PageQuery, ResultVO>
        extends BaseController<Id, Entity> {
    Logger log = LoggerFactory.getLogger(PageController.class);

    /**
     * 获取返回VO的类型
     *
     * @return 实体的类型
     */
    Class<ResultVO> getResultVOClass();

    /**
     * 处理查询参数
     *
     * @param params 前端传递的参数
     * @author yangjunxiong
     */
    default void handlerQueryParams(PageParams<PageQuery> params) {
    }

    /**
     * 执行分页查询
     * <p>
     * 子类可以覆盖后重写查询逻辑
     *
     * @param params 分页参数
     * @return 分页信息
     */
    default IPage<ResultVO> query(PageParams<PageQuery> params) {
        // 处理查询参数，如：覆盖前端传递的 current、size、sort 等参数 以及 model 中的参数 【提供给子类重写】【无默认实现】
        handlerQueryParams(params);
        // 执行单表分页查询
        return getSuperService().page(params, getResultVOClass());
    }

    /**
     * 分页查询
     *
     * @param params 分页参数
     * @return 分页数据s
     */
//    @OperateLog(name = "分页查询", type = {OperateTypeEnum.GET}, logResultData = false)
    @Operation(summary = "分页查询", description = "分页查询")
    @PostMapping(value = "/page")
//    @WebLog(value = "'分页列表查询:第' + #params?.current + '页, 显示' + #params?.size + '行'", response = false)
    default R<PageResult<ResultVO>> page(@RequestBody @Validated PageParams<PageQuery> params) {
        log.info("{}.page.分页查询,请求参数:params:{}", this.getClass().getName(), CommonBeanUtils.toJSONString(params));
        IPage<ResultVO> page = query(params);
        return success(PageResultUtils.toPageResult(page));
    }
}
